package example.proxy.JDKProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 使用JDK动态代理对sing()添加功能
 */
public class JDKProxy {
    public static void main(String[] args) {
        // 创建被代理的对象
        VocalConcert vocalConcert = new VocalConcert();

        /*
         * ClassLoader loader:类的加载器---联系方式
         * Class<?>[] interfaces:类的接口类型---被代理人的类型
         * InvocationHandleer h:处理---我要帮你干什么
         */
        VocalConcertInterface jjr = (VocalConcertInterface) Proxy.newProxyInstance(VocalConcert.class.getClassLoader(), VocalConcert.class.getInterfaces(), new InvocationHandler() {

            /**
             *  Object proxy:被代理对象的引用，系统会自动创建被代理对象的一个映射
             * Method method:被代理对象的方法
             * @param args
             *Object[] args:被代理对象方法的参数
             * 返回值是被代理对象执行后的返回值
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object result = null;
                result = method.invoke(vocalConcert, args);
                System.out.println("添加功能");
                return result;
            }
        });

        // 执行功能
        String sing = jjr.sing();
        System.out.println(sing);
    }
}
